package com.lzk.service;

import com.github.wxpay.sdk.WXPayUtil;
import com.lzk.model.HttpClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by Linzk on 2020/12
 *
 *
 */
@Service
public class WeixinPayServiceImpl implements WeixinPayService {

    @Value("${appid}")
    private String appid;
    @Value("${partner}")
    private String partner;
    @Value("${partnetkey}")
    private String partnetkey;

    /**
     * 实现生成二维码接口createNative()
     * 步骤如下↓：
     *  -1 参数封装
     *  -2 发送请求
     *  -3 获取结果
     *
     * @param out_trade_no
     * @param total_fee
     * @return
     */
    @Override
    public Map createNative(String out_trade_no, String total_fee) {
            //    *  -1 参数封装
        Map param = new HashMap();
        param.put("appid",appid);  //公众账号ID
        param.put("mch_id",partner); //商户号
        //调用微信SDK里面的工具类WXPayUtil，生成一个随机字符串
        param.put("nonce_str", WXPayUtil.generateNonceStr()); //随机字符串
        //微信的SDK有一个自动生成签名的功能，因为最终SDK工具类会自动加上这个签名，这里先不加上
//        param.put("sign","");       //签名
        param.put("body","@linzk");       //二维码上面显示的名字：即商品描述
        param.put("out_trade_no",out_trade_no);   //外部传进来的订单号--->商户订单号
        param.put("total_fee",total_fee);      //标价金额
        /**
         * //终端IP：就是你发请求的IP地址
         *  -但是这个终端IP并没有上面用，他只是做一个记录使用而已
         *  -这个对于我们的二维码生成不起任何作用，随便写即可！
         *  -但这里属于必填项，因此要给出来，但实际用不到
         */
        param.put("spbill_create_ip","127.0.0.1");
        /**
         * //通知地址：就是回调地址
         *  -这里这个回调地址，其实也可以写死，在这里没什么具体用途。
         *  -但这里属于必填项，因此要给出来，但实际用不到
         */
        param.put("notify_url","http://www.lzk123.cn");
        param.put("trade_type","NATIVE");     //交易类型

        //将上面数据，生成一个带签名的XML
        try {
            String xmlParam = WXPayUtil.generateSignedXml(param, partnetkey);
            System.out.println("请求的参数Map转Xml为：" + xmlParam);


            //    *  -2 发送请求
            /**
             * -(这里用自己创建的HttpClient类)
             * -参数URL：用的是微信SDK里面的那个url地址
             * https://api.mch.weixin.qq.com/pay/unifiedorder
             */
            //    (这里用自己创建的HttpClient类)
            HttpClient httpClient = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
            httpClient.setHttps(true);
            httpClient.setXmlParam(xmlParam);
            httpClient.post();//发送请求

            //    *  -3 获取结果
            /**
             * 获取到的结果是一个XML的数据
             *      -->得到的这个mapResult包含很多数据，其中里面的
             *      一个参数"二维码连接"code_url：就是我们希望得到的！
             */
            String xmlResult = httpClient.getContent();
            Map<String, String> mapResult = WXPayUtil.xmlToMap(xmlResult);
            System.out.println("微信返回后，接收到的结果：" + mapResult);
            /**
             * 将获取的一大堆数据里面，获取"二维码连接"code_url,并封装到一个Map里面
             * --->封装一个新的Map来存放"二维码连接"是为了防止返回太多没用的信息。
             *
             * --->因此这里只封装我们需要的东西。
             */

            Map map = new HashMap();
            //生成支付二维码的链接地址
            map.put("code_url",mapResult.get("code_url"));
            //并将传过来的"订单号"和"金额"再封装回去
            map.put("out_trade_no",out_trade_no);
            map.put("total_fee",total_fee);
            return map;

        } catch (Exception e) {
            e.printStackTrace();
            return new HashMap();
        }

    }

    /**
     * 下面的接口实现的是-->一个查询订单的接口，
     * 但是对于支付是否成功或失败，需要在Controller类中编写代码根据获取到的这个结果
     * 来判断支付成功或失败
     * @param out_trade_no
     * @return
     */
    @Override
    public Map queryPaySattus(String out_trade_no) {
        //*  -1 参数封装
        Map param = new HashMap();
        param.put("appid",appid);  //公众账号ID
        param.put("mch_id",partner); //商户号
        param.put("out_trade_no",out_trade_no); //商户订单号
        param.put("nonce_str",WXPayUtil.generateNonceStr());  //随机字符串,使用SDK的工具生成
//        param.put("sign",); //签名,他会自动生成，所以不需要添加进来。
        //1.1 根据上面参数，生成一个带签名的XML
        try {
            String paramXml = WXPayUtil.generateSignedXml(param, partnetkey);
            //*  -2 发送请求
            //2.1 将微信API里面，查询订单的URL连接复制进来，黏贴到下面
            HttpClient httpClient = new HttpClient("https://api.mch.weixin.qq.com/pay/orderquery");
            httpClient.setHttps(true);
            httpClient.setXmlParam(paramXml);
            httpClient.post();//发送请求


            //*  -3 获取结果
            String xmlResult = httpClient.getContent();
            Map<String, String> map = WXPayUtil.xmlToMap(xmlResult);
            System.out.println("调用微信查询API，返回结果：" + map);
            return map;


        } catch (Exception e) {
            e.printStackTrace();
            //有异常情况，返回null
            return new HashMap();
        }
    }
}
